package com.example.demo.common;

import java.io.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 张
 * Date: 2024-07-30
 * Time: 1:33
 */
//提供二进制序列化 和 反序列化
//下列的序列化和反序列化逻辑适用于所有的Java对象(前提 : 需要进行序列化和反序列化的对象必须实现Serializable接口 --- Java标准库的要求)
public class BinaryTool {
    //序列化
    public static byte[] toBytes(Object object) throws IOException {
        //这个流对象相当于一个变长的字节数值
        //就可以把object序列化的数据给写入到byteArrayOutputStream中,在统一 转成byte[]
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//这个不进行关闭也可以
        try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
            //此处的 writeObject 就会把该对象进行序列化,写入到objectOutputStream   (关联到哪的流对象就写到哪!!!!)
            //由于objectOutputStream 和 byteArrayOutputStream是关联的, 所以最终还是写入到了byteArrayOutputStream中
            objectOutputStream.writeObject(object);
        }
        //把byteArrayOutputStream中持有的二进制数据取出,转成byte数组
        return byteArrayOutputStream.toByteArray();
    }

    //反序列化
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try(ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                //此处的readObject,就是从data中读数据并进行反序列化
                object = objectInputStream.readObject();//读数据 + 反序列化
            }
        }
        return object;
    }
    // ByteArrayInputStream 和 ByteArrayOutputStream 主要是可变长的流对象方便我们进行读写数据(容器)
    // objectOutputStream 和 objectInputStream 是序列化和反序列化的关键API
}
